"""
关系运算符的种类、使用方法、链式比较、类型比较、浮点数比较注意事项以及在实际开发中的应用场景

一、关系运算符种类和用法
Python 提供 6 种关系运算符 <,<=,>,>=,==,!= ，用来比较两个之间的关系，返回结果为bool值

二、关系运算符的链式比较
链式比较 Python 关系运算符的一个强大特性，它允许在一条表达式中连续比较多个对象，无需使用多余的 and 关键字，从而让代码更简洁、可读性更强。
比如 a < b and b<c 可以直接写成链式 a<b<c

注意：
1.链式比较中每个比较都会执行，但变量只会被计算一次（如x在1 < x < 10中只取值一次）
2.只会对相邻对象依次比较，比如a < b > c等价于(a < b) and (b > c)，不会比较a < c。
3.链式比较存在短路特性，表达式左到右短路，一旦有一个条件为False，后续不再计算

三、类型比较

 类型比较是指参与比较的对象的数类型是兼容性数据类型或者相同的数据类型

 类型比较可以归纳为下几点：

 1.同类型（int/int、str/str等）之间的值进行比较时，6个关系运算符（<, <=, >, >=, ==, !=）全可以使用。
 2.兼容性数据类型之间比较时，底层会自动进行转换,比如int 与 float 支持比较（5 < 3.14、7 == 7.0等成立），底层会自动转为 float。
 3.不同的数据类型之间通常只有等于和不等于（== 与 !=）能比较，且一般返回 False，使用其他4个关系运算符进行比较则会出现TypeError错误
 4.列表，元组的比较是左到右依次比较，每个位置对应的元素都相同时，再比较长度大小，长度大的为大
 5.字典之间的大小比较，则是判断“所有键值对完全一致”才判等，和顺序无关
 6.自定义类的比较，则是需要自定义类实现关系元素对应的6个魔术方法__eq__,__lt__,__gt__,__ge__,__le__,__ne__
 7.关系运算符和逻辑运算符的结合使用，和 and 结合，则可以简写为链式比较的写法




"""

# 定义列表变量
list1 = [1, 2, 3]
list2 = [1, 2, 4]
list3 = [1, 2, 3]
list4 = [1, 2]

# 列表比较（按元素逐个比较）
print(f"{list1} < {list2}: {list1 < list2}")  # [1, 2, 3] < [1, 2, 4]: True
print(f"{list1} > {list2}: {list1 > list2}")  # [1, 2, 3] > [1, 2, 4]: False
print(f"{list1} == {list3}: {list1 == list3}")  # [1, 2, 3] == [1, 2, 3]: True
print(f"{list1} != {list2}: {list1 != list2}")  # [1, 2, 3] != [1, 2, 4]: True

# 长度不同的列表比较
print(f"{list1} > {list4}: {list1 > list4}")  # [1, 2, 3] > [1, 2]: True
print(f"{list4} < {list1}: {list4 < list1}")  # [1, 2] < [1, 2, 3]: True

# 嵌套列表比较
print("\n=== 嵌套列表比较 ===")
nested_list1 = [[1, 2], [3, 4]]
nested_list2 = [[1, 2], [3, 5]]
print(f"{nested_list1} < {nested_list2}: {nested_list1 < nested_list2}")

# 混合类型列表比较
print("\n=== 混合类型列表比较 ===")
mixed_list1 = [1, "hello", 3.14]
mixed_list2 = [1, "world", 3.14]
print(f"{mixed_list1} < {mixed_list2}: {mixed_list1 < mixed_list2}")

# 版本号的比较
v1 = "3.9.1".split(".")
v2 = "3.10.0".split(".")
print([int(x) for x in v1] < [int(x) for x in v2])  # True
